// 方法一：手写实现setTimeout，但是会一直占用主线程
function mySetTimeout(fn, time) {
  let now = Date.now();
  let flag = true;

  while (flag) {
    if (Date.now() - now >= time) {
      flag = false;
      fn();
    }
  }
}

// 方法二：使用 requestAnimationFrame 实现
// 浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数，该回调函数会在浏览器下一次重绘之前执行
function mySetTimeout2(fn, time, ...args) {
  let cur = +new Date()
  let now
  let timer

  function bar() {
    timer = window.requestAnimationFrame(bar)
    now = +new Date()
    if (now - cur >= time) {
      fn.apply(this, args)
      window.cancelAnimationFrame(timer)
      timer = null
    }
  }

  timer = window.requestAnimationFrame(bar)
}

// 方法三：使用 setInterval 实现
function mySetTimeout3(fn, time) {
  const timer = setInterval(() => {
    clearInterval(timer);
    fn();
  }, time);
};

mySetTimeout2(() => {
  console.log('88888')
}, 1000)


// 使用 setTimeout 模拟 setInterval
function mysetInterval(fn, time) {
  let timer = null
  function bar() {
    fn()
    timer = setTimeout(bar, time)
  }
  bar()

  mysetInterval.clear = function () {
    clearTimeout(timer)
  }
}
